package com.cruise.game.mapper;

import com.cruise.game.model.entity.Order;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 订单Mapper接口
 * 
 * @author cruise
 * @date 2025-02-28
 */
@Repository
public interface OrderMapper extends BaseMapper<Order> {

    /**
     * 查询订单列表（带条件）
     * 
     * @param params 查询参数
     * @return 订单列表
     */
    List<Map<String, Object>> selectOrderListByParams(Map<String, Object> params);

    /**
     * 统计订单列表（带条件）
     * 
     * @param params 查询参数
     * @return 订单数
     */
    long countOrderListByParams(Map<String, Object> params);

    /**
     * 统计代理指定时间段内订单数
     * 
     * @param agentId   代理ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 订单数
     */
    int countByAgentIdAndTimeRange(@Param("agentId") Long agentId, @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime);

    /**
     * 统计代理指定状态订单数
     * 
     * @param agentId 代理ID
     * @param status  状态
     * @return 订单数
     */
    int countByAgentIdAndStatus(@Param("agentId") Long agentId, @Param("status") String status);

    /**
     * 计算代理指定时间段内收入
     * 
     * @param agentId   代理ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 收入金额
     */
    BigDecimal sumIncomeByAgentIdAndTimeRange(@Param("agentId") Long agentId,
            @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 计算代理总收入
     * 
     * @param agentId 代理ID
     * @return 收入金额
     */
    BigDecimal sumIncomeByAgentId(@Param("agentId") Long agentId);

    /**
     * 统计指定状态的订单数
     * 
     * @param status 状态
     * @return 订单数
     */
    int countByStatus(@Param("status") String status);

    /**
     * 统计指定时间范围内的售后订单数
     * 
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 订单数
     */
    int countAfterSalesOrdersByTimeRange(@Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime);

    /**
     * 统计用户指定状态的订单数
     * 
     * @param userId 用户ID
     * @param status 状态（可选）
     * @return 订单数
     */
    int countByUserId(@Param("userId") Long userId, @Param("status") String status);

    /**
     * 计算指定时间范围内的订单总金额
     * 
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 订单总金额
     */
    BigDecimal sumOrderAmount(@Param("startDate") java.time.LocalDate startDate,
            @Param("endDate") java.time.LocalDate endDate);

    /**
     * 查询待接单列表
     * 
     * @param gameCategoryId 游戏分类ID
     * @param limit          限制数量
     * @return 订单列表
     */
    List<Order> selectPendingOrders(@Param("gameCategoryId") Long gameCategoryId, @Param("limit") int limit);

    /**
     * 查询最近完成的订单
     * 
     * @param limit 限制数量
     * @return 订单列表
     */
    List<Map<String, Object>> selectRecentOrders(@Param("limit") int limit);

    /**
     * 查询最后一个订单号
     * 
     * @return 订单号
     */
    String selectLastOrderNumber();

    /**
     * 统计代理待处理订单数
     * 
     * @param agentId 代理ID
     * @return 订单数
     */
    int countPendingOrdersByAgentId(@Param("agentId") Long agentId);

    /**
     * 统计代理进行中订单数
     * 
     * @param agentId 代理ID
     * @return 订单数
     */
    int countInProgressOrdersByAgentId(@Param("agentId") Long agentId);

    /**
     * 计算代理月收入
     * 
     * @param agentId 代理ID
     * @return 收入金额
     */
    BigDecimal sumMonthlyIncomeByAgentId(@Param("agentId") Long agentId);

    /**
     * 统计指定时间范围内的订单数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 订单数
     */
    int countOrdersByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 统计指定时间范围内的已完成订单数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 订单数
     */
    int countCompletedOrdersByTimeRange(@Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime);

    /**
     * 计算指定时间范围内的订单总金额
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 订单总金额
     */
    BigDecimal sumOrderAmountByTimeRange(@Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime);

    /**
     * 更新订单状态
     *
     * @param id     订单ID
     * @param status 状态
     * @return 影响的行数
     */
    int updateStatus(@Param("id") Long id, @Param("status") String status);
}